package exercise;

import java.util.Arrays;

/**
 *  设计循环队列
 * 设计你的循环队列实现。 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
 *
 * 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里，一旦一个队列满了，我们就不能插入下一个元素，即使在队列前面仍有空间。但是使用循环队列，我们能使用这些空间去存储新的值。
 *
 * 你的实现应该支持如下操作：
 *
 * MyCircularQueue(k): 构造器，设置队列长度为 k 。
 * Front: 从队首获取元素。如果队列为空，返回 -1 。
 * Rear: 获取队尾元素。如果队列为空，返回 -1 。
 * enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
 * deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
 * isEmpty(): 检查循环队列是否为空。
 * isFull(): 检查循环队列是否已满。
 *
 * 示例：
 *
 * MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
 * circularQueue.enQueue(1);  // 返回 true
 * circularQueue.enQueue(2);  // 返回 true
 * circularQueue.enQueue(3);  // 返回 true
 * circularQueue.enQueue(4);  // 返回 false，队列已满
 * circularQueue.Rear();  // 返回 3
 * circularQueue.isFull();  // 返回 true
 * circularQueue.deQueue();  // 返回 true
 * circularQueue.enQueue(4);  // 返回 true
 * circularQueue.Rear();  // 返回 4
 */

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 苏李涛
 * Date: 2024-07-16
 * Time: 22:53
 */

public class QueueExercise {

   static class MyCircularQueue {
        public int Rear;
        public int Front;
        public int[] elem;
        public MyCircularQueue(int k) {
            elem = new int[k+1];
        }




       //入队列
        public boolean enQueue(int value) {
            if(isFull()) {
                return false;
            }
            elem[Rear] = value;
            Rear = (Rear+1) % elem.length;
            return true;
        }

        //出队列
        public boolean deQueue() {
            if(isEmpty()) {
                return false;
            }
            Front = (Front+1) % elem.length;
            return true;
        }

        //不删除获取队头
        public int Front() {
            if(isEmpty()) {
                return -1;
            }

            return elem[Front];
        }

        //获取队尾
        public int Rear() {
            if(isEmpty()) {
                return -1;
            }


            //Rear是插入元素遍历数组的下标
            int index = ((Rear == 0) ? (elem[elem.length-1]) : (elem[Rear-1]));
            return index;
        }

        public boolean isEmpty() {
            return Rear == Front;
        }

        public boolean isFull() {
            return (Rear+1) % elem.length == Front;
        }

    }

    public static void main(String[] args) {
        QueueExercise.MyCircularQueue circularQueue  = new MyCircularQueue(6);
        System.out.println(circularQueue.enQueue(6));  // 返回 true
        System.out.println(circularQueue.Rear());  // 返回 6
        System.out.println(circularQueue.Rear());  // 返回 6
        System.out.println(circularQueue.deQueue()); //true
        System.out.println(circularQueue.enQueue(5)); //true
        System.out.println(circularQueue.Rear()); //5
        System.out.println(circularQueue.deQueue()); //true
        System.out.println(circularQueue.Front()); //-1
        System.out.println(circularQueue.deQueue()); //false
        System.out.println(circularQueue.deQueue()); //false
        System.out.println(circularQueue.deQueue()); //false

    }

}
